from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session
from config import settings
import redis
from typing import Generator

# 创建数据库引擎
engine = create_engine(
    settings.database_url,
    echo=settings.debug,  # 在开发环境下打印SQL语句
    pool_pre_ping=True,   # 连接池预检查
    pool_recycle=3600     # 连接回收时间
)

# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建基础模型类
Base = declarative_base()

# Redis连接
try:
    redis_client = redis.from_url(settings.redis_url, decode_responses=True)
    # 测试连接
    redis_client.ping()
except Exception as e:
    print(f"Redis连接失败: {e}")
    redis_client = None

def get_db() -> Generator[Session, None, None]:
    """
    获取数据库会话
    用于依赖注入，确保每个请求都有独立的数据库会话
    """
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

def get_redis():
    """
    获取Redis客户端
    用于缓存和会话存储
    """
    return redis_client

def init_db():
    """
    初始化数据库
    创建所有表结构
    """
    from models import Base
    Base.metadata.create_all(bind=engine)
    print("数据库表创建完成")

def drop_db():
    """
    删除所有数据库表
    仅用于开发和测试环境
    """
    from models import Base
    Base.metadata.drop_all(bind=engine)
    print("数据库表删除完成")

def reset_db():
    """
    重置数据库
    删除所有表后重新创建
    """
    drop_db()
    init_db()
    print("数据库重置完成")